home *** CD-ROM | disk | FTP | other *** search
- /* POLYGON.H: Header file for filled polygon drawing and 3D animation. */
-
- #define MAX_OBJECTS 100 /* max simultaneous # objects supported */
- #define MAX_POLY_LENGTH 4 /* four vertices is the max per poly */
- #define SCREEN_WIDTH 320
- #define SCREEN_HEIGHT 240
- #define PAGE0_START_OFFSET 0
- #define PAGE1_START_OFFSET (((long)SCREEN_HEIGHT*SCREEN_WIDTH)/4)
-
- /* Ball movement flags */
- #define MOVE_LEFT 0x0001
- #define MOVE_RIGHT 0x0002
- #define MOVE_UP 0x0004
- #define MOVE_DOWN 0x0008
- #define MOVE_TOWARD 0x0010
- #define MOVE_AWAY 0x0020
- #define FLIP_SPIN_AXIS 0x0040
-
- /* Maximum number of simultaneously active spotlights */
- #define MAX_SPOTS 3
-
- /* Ratio: distance from viewpoint to projection plane / width of
- projection plane. Defines the width of the field of view. Lower
- absolute values = wider fields of view; higher values = narrower */
- #define PROJECTION_RATIO -2.0 /* negative because visible Z
- coordinates are negative */
-
- /* Draws the polygon described by the point list PointList in color
- Color with all vertices offset by (X,Y) */
- #define DRAW_POLYGON(PointList,NumPoints,Color,X,Y) \
- Polygon.Length = NumPoints; Polygon.PointPtr = PointList; \
- FillConvexPolygon(&Polygon, Color, X, Y);
-
- /* Draws the polygon described by the point list PointList with a bitmap
- texture mapped onto it */
- #define DRAW_TEXTURED_POLYGON(PointList,NumPoints,TexVerts,TexMap) \
- Polygon.Length = NumPoints; Polygon.PointPtr = PointList; \
- DrawTexturedPolygon(&Polygon, TexVerts, TexMap);
-
- #define INT_TO_FIXED(x) (((long)(int)x) << 16)
- #define DOUBLE_TO_FIXED(x) ((long) (x * 65536.0 + 0.5))
- #define FIXED_TO_DOUBLE(x) (((double)x) / 65536.0)
- #define FIXED_TO_INT(FixedVal) ((int) (FixedVal >> 16))
- #define ROUND_FIXED_TO_INT(FixedVal) \
- ((int) ((FixedVal + DOUBLE_TO_FIXED(0.5)) >> 16))
-
- /* Sets a color intensity to the specified levels */
- #define SET_INTENSITY(IntensityTemp, R, G, B) \
- IntensityTemp.Red = DOUBLE_TO_FIXED(R); \
- IntensityTemp.Green = DOUBLE_TO_FIXED(G); \
- IntensityTemp.Blue = DOUBLE_TO_FIXED(B);
-
- /* Converts a color component value between 0 and 1 to an R, G, or B
- value between 0 and 255. Allows expressing color components as fractions
- in the range 0 and 1, although internally (in ModelColor structures)
- they're actually represented as values between 0 and 255 */
- #define CCOMP(Color) ((Color<0) ? 0 : \
- ((Color>=1) ? 255 : ((double)Color*255.0+0.5)))
-
- /* Calculates dot product */
- #define DOT_PRODUCT(V1,V2) \
- (FixedMul(V1.X,V2.X)+FixedMul(V1.Y,V2.Y)+FixedMul(V1.Z,V2.Z))
-
- /* Retrieves the specified pixel from the specified image bitmap of the
- specified width. */
- #define GET_IMAGE_PIXEL(TexMapBits, TexMapWidth, X, Y) \
- TexMapBits[(Y * TexMapWidth) + X]
-
- /* Masks to mark shading types in Face structure */
- #define NO_SHADING 0x0000
- #define AMBIENT_SHADING 0x0001
- #define DIFFUSE_SHADING 0x0002
- #define TEXTURE_MAPPED_SHADING 0x0004
-
- typedef long Fixedpoint;
- typedef unsigned int TAngle; /* angle in tenths of degrees */
- typedef Fixedpoint Xform[3][4];
-
- /* Describes a single 2D point */
- typedef struct _Point {
- int X;
- int Y;
- } Point;
-
- /* Describes a color in the current color model, the RGB color cube */
- typedef struct _ModelColor {
- unsigned char Red; /* 255 = max red, 0 = no red */
- unsigned char Green; /* 255 = max green, 0 = no green */
- unsigned char Blue; /* 255 = max blue, 0 = no blue */
- } ModelColor;
-
- /* Describes an intensity in the current color model, the RGB color cube */
- typedef struct _ModelIntensity {
- Fixedpoint Red;
- Fixedpoint Green;
- Fixedpoint Blue;
- } ModelIntensity;
-
- /* Describes a single 3D point in homogeneous coordinates; the W
- coordinate isn't present, though; assumed to be 1 and implied */
- typedef struct _Point3 {
- Fixedpoint X;
- Fixedpoint Y;
- Fixedpoint Z;
- } Point3;
-
- typedef struct {
- int X;
- int Y;
- int Z;
- } IntPoint3;
-
- /* Describes a series of points (used to store a list of vertices that
- describe a polygon; each vertex is assumed to connect to the two
- adjacent vertices; last vertex is assumed to connect to first) */
- typedef struct {
- int Length;
- Point * PointPtr;
- } PointListHeader;
-
- /* Describes the beginning and ending X coordinates of a single
- horizontal line */
- typedef struct {
- int XStart;
- int XEnd;
- } HLine;
-
- /* Describes a Length-long series of horizontal lines, all assumed to
- be on contiguous scan lines starting at YStart and proceeding
- downward (used to describe a scan-converted polygon to the
- low-level hardware-dependent drawing code) */
- typedef struct {
- int Length;
- int YStart;
- HLine * HLinePtr;
- } HLineList;
-
- /* Describes a rectangle */
- typedef struct {
- int Left;
- int Top;
- int Right;
- int Bottom;
- } Rect;
-
- /* Describes a texture map */
- typedef struct {
- int TexMapWidth; /* texture map width in bytes */
- char *TexMapBits; /* pointer to texture bitmap */
- } TextureMap;
-
- /* Structure describing one face of an object (one polygon) */
- typedef struct {
- int * VertNums; /* pointer to list of indexes of this polygon's
- vertices in the object's vertex list. The first two
- indexes must select the end and start points,
- respectively, of this polygon's unit normal vector.
- The second point should also be an active polygon
- vertex */
- int NumVerts; /* # of verts in face, not including the initial
- vertex, which must be the end of a unit normal vector
- that starts at the second index in VertNums */
- int ColorIndex; /* direct palette index; used only for non-shaded
- faces */
- ModelColor FullColor; /* polygon's color */
- int ShadingType; /* none, ambient, diffuse, texture mapped, etc. */
- TextureMap * TexMap; /* pointer to bitmap for texture mapping, if any */
- Point * TexVerts; /* pointer to list of this polygon's vertices, in
- TextureMap coordinates. Index n must map to index
- n + 1 in VertNums, (the + 1 is to skip over the unit
- normal endpoint in VertNums) */
- } Face;
-
- typedef struct { TAngle RotateX, RotateY, RotateZ; } RotateControl;
-
- /* Fields common to every object */
- #define BASE_OBJECT \
- struct _Object *NextObject; \
- struct _Object *PreviousObject; \
- Point3 CenterInView; /* coord of center in view space */ \
- void (*DrawFunc)(); /* draws object */ \
- void (*RecalcFunc)(); /* prepares object for drawing */ \
- void (*MoveFunc)(); /* moves object */ \
- int RecalcXform; /* 1 to indicate need to recalc */ \
- Rect EraseRect[2]; /* rectangle to erase in each page */
- /* Basic object */
- typedef struct _Object { BASE_OBJECT } Object;
- /* Structure describing a polygon-based object */
- typedef struct {
- BASE_OBJECT
- int RDelayCount, RDelayCountBase; /* controls rotation speed */
- int MDelayCount, MDelayCountBase; /* controls movement speed */
- Xform XformToWorld; /* transform from object->world space */
- Xform XformToView; /* transform from object->view space */
- RotateControl Rotate; /* controls rotation change over time */
- int NumVerts; /* # vertices in VertexList */
- int NumRealVerts; /* # vertices that aren't unit normal
- endpoints. Unit normal endpoints must appear
- last in VertexList, and aren't transformed
- into screen space or screen coordinates */
- Point3 * VertexList; /* untransformed vertices */
- Point3 * XformedVertexList; /* transformed into view space */
- Point3 * ProjectedVertexList; /* projected into screen space */
- Point * ScreenVertexList; /* converted to screen coordinates */
- int NumFaces; /* # of faces in object */
- Face * FaceList; /* pointer to face info */
- } PObject;
-
- extern void XformVec(Xform, Fixedpoint *, Fixedpoint *);
- extern void ConcatXforms(Xform, Xform, Xform);
- extern int FillConvexPolygon(PointListHeader *, int, int, int);
- extern void SetGraphicsMode(void);
- extern void ShowPage(unsigned int);
- extern void FillRectangleX(int, int, int, int, unsigned int, int);
- extern void XformAndProjectPObject(PObject *);
- extern void DrawPObject(PObject *);
- extern void AppendRotationX(Xform, TAngle);
- extern void AppendRotationY(Xform, TAngle);
- extern void AppendRotationZ(Xform, TAngle);
- extern Fixedpoint FixedMul(Fixedpoint, Fixedpoint);
- extern Fixedpoint FixedDiv(Fixedpoint, Fixedpoint);
- extern void InitializeFixedPoint(void);
- extern void RotateAndMoveBall(PObject *);
- extern void InitializeCubes(void);
- extern void InitializeBalls(void);
- extern void CosSin(TAngle, Fixedpoint *, Fixedpoint *);
- extern void AddObject(Object *);
- extern void SortObjects(void);
- extern void InitializeObjectList(void);
- extern int ModelColorToColorIndex(ModelColor * Color);
- extern void IntensityAdjustColor(ModelColor *, ModelColor *,
- ModelIntensity *);
- extern void InitializeLighting(void);
- extern void SetAmbientIntensity(ModelIntensity *);
- extern ModelIntensity * GetAmbientIntensity(void);
- extern void TurnSpotOn(int);
- extern void TurnSpotOff(int);
- extern void SetSpotDirection(int, Point3 *);
- extern void SetSpotIntensity(int, ModelIntensity *);
- extern Point3 * GetSpotDirection(int);
- extern ModelIntensity * GetSpotIntensity(int);
- extern int GetSpotState(int);
- extern void TurnAmbientOn(void);
- extern void TurnAmbientOff(void);
- extern int GetAmbientState(void);
- extern void DrawTexturedPolygon(PointListHeader *, Point *, TextureMap *);
- extern void WritePixelX(int, int, int);
- extern int DisplayedPage, NonDisplayedPage, RecalcAllXforms;
- extern int NumObjects;
- extern Object ObjectListStart, ObjectListEnd;
- extern Xform WorldViewXform;
- extern Object *ObjectList[];
- extern Point3 CubeVerts[];
- extern unsigned int CurrentPageBase;
- extern unsigned int PageStartOffsets[2];
- extern int ClipMinX, ClipMinY, ClipMaxX, ClipMaxY;
- extern ModelIntensity AmbientIntensity;
- extern Point3 SpotDirectionWorld[];
- extern Point3 SpotDirectionView[];
- extern ModelIntensity SpotIntensity[];
- extern int SpotOn[];
- extern int AmbientOn;
- extern int BallEvent;
-